feat(thread): new ChatX conversation thread (behind useNewChatThread flag)#3022
Conversation
|
React Doctor found 6 issues in 3 files · 6 warnings. 6 warnings
Reviewed by React Doctor for commit |
|
d706d43 to
668dbd4
Compare
…utoscroll scrollbar Polish pass on the experimental ChatX thread (behind settingsStore.useNewChatThread): - UserBubble: restore the channel CONTEXT.md / canvas-instructions context chips (ChatMessageHeader) and the hover send-timestamp (ChatMessageFooter), and render stripped content so the injected XML blocks never leak. File/attachment mentions restored too. - Hide SessionResourcesBar in the new thread (the chips live on the user message now). - Gate the shared session-update changes so the legacy ConversationView is unchanged when the flag is off: ProgressGroupView and SubagentToolView keep their bespoke rendering for the legacy thread and only route through ToolRow under the chat-thread chrome context; ToolCallView's input-preview restyle is gated too. - globals.css: keep the chat scroller's scrollbar visible while auto-scrolling, so it no longer flickers away on every collapsible toggle. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tion spinner
New ChatX thread polish (behind settingsStore.useNewChatThread) plus a shared
compaction fix:
- Move SessionFooter back into the thread (last row) instead of under the composer;
add group/thread so its hover-reveal works. New ChatThreadFooter wrapper.
- Render turn_cancelled ("Interrupted by user") and compaction boundary
("Conversation compacted") as ChatMarker separator rows in the new thread; the
legacy thread keeps its existing rendering (gated via chat-thread chrome).
- Fix the "Compacting…" spinner spinning forever after a failed compaction: a
failed compaction emits no compact_boundary, so the agent now sends a structured
compacting_failed status that clears the spinner and renders the outcome (a
separator marker in the new thread, a status row in the legacy thread) instead of
assistant prose.
- Drop the now-redundant globals.css scrollbar override (quill no longer hides the
scrollbar on data-autoscrolling).
- Point @posthog/quill at the published 0.3.0-beta.21 (drops the local-tarball
override) now that the ChatX primitives are on npm.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
668dbd4 to
ab9a444
Compare
…, react-doctor - ChatThread: stop syncing `offscreen` to the anchor prop inside the sticky-header effect (the render already guards on `active`), clearing the blocking react-doctor `no-adjust-state-on-prop-change` finding. - ToolGroup: a missing tool-map entry means the tool is still in-flight, so default its status to "in_progress" instead of casting to a status-less ToolCall — fixes the group label reading "Used …" mid-stream (greptile P1). - ToolGroup: split PascalCase tool names so `ToolSearch` reads "Tool search", not "Toolsearch" (greptile P2). - SessionView: comment why the pending-permission box uses `shrink-0` (greptile P2). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Summary
Experimental rebuild of the conversation thread on the new ChatX (quill) primitives, gated behind
settingsStore.useNewChatThread(Settings → Advanced → "Use new chat thread"). The productionConversationViewis unchanged when the flag is off.ChatThreadrenderer built onChatMessageScroller/ChatMessage/ChatBubble/ChatMarker, selected at the mount boundary viaThreadView.session-updatetool views serve both threads: aChatThreadChromeProvidercontext flipsToolRow(and friends) to the ChatX chrome only inside the new thread, so nothing forks and the legacy thread is untouched.UserBubble: channelCONTEXT.md/ canvas-instructions context chips (ChatMessageHeader), hover send-timestamp (ChatMessageFooter), file/attachment mentions, and stripped content so injected XML never leaks.SessionResourcesBarhidden in the new thread (context now lives on the user message).globals.css: keep the chat scroller's scrollbar visible while auto-scrolling — it previously flickered away on every collapsible toggle..local-quill/, gitignored); revert to the published catalog version before this lands.Gating
Reviewed the whole diff: every change to a shared
session-updatecomponent is gated viauseChatThreadChrome()(defaultfalse) or branches that preserve legacy rendering byte-for-byte.ProgressGroupViewandSubagentToolViewkeep their bespoke legacy rendering and only route throughToolRowunder the chat-thread chrome.Test plan
🤖 Generated with Claude Code